package com.cn.spring.web.spring;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import com.cn.spring.web.logs.AsyncLogRecord;


/**
 * 获取Spring Bean的通用方法，任意位置都能获取到
 * 
 * @author July july_sky@foxmail.com
 * @date 2015年4月3日下午3:37:09
 * @Copyright ©2003-2015 北京春秋永乐文化传播有限公司. All Rights Reserved.
 * @version 1.0
 */
public class SpringContextHolder implements ApplicationContextAware {
	public static ApplicationContext applicationContext = null;
	
	/**
	 * 通过beanName获取spring管理的bean
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2015年4月3日下午3:35:57
	 * @param name
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(String name) {
		checkApplicationContext();
		return (T) applicationContext.getBean(name);
	}
	
	/**
	 * 根据class获取spring管理的bean
	 * 
	 * @author July july_sky@foxmail.com
	 * @date 2015年4月3日下午3:36:19
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(Class<T> clazz) {
		checkApplicationContext();
		return (T) applicationContext.getBeansOfType(clazz);
	}


	/**
	 * 检验ApplicationContext是否成功注入
	 * 
	 * @Title checkApplicationContext
	 * @Author July
	 * @Email july_sky@foxmail.com
	 * @Date 2014年10月21日 上午11:06:59
	 * @ModifyDate 2014年10月21日 上午11:06:59
	 * @ModifyAuthor July
	 * @Version 0.9
	 */
	private static void checkApplicationContext() {
		if (applicationContext == null) {
			//AsyncLogRecord.getInstance().error("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder",SpringContextHolder.class);
			throw new IllegalStateException(
					"applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
		}
	}

	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringContextHolder.applicationContext = applicationContext;
		AsyncLogRecord.getInstance().info("applicationContext初始化", this.getClass());
	}
}
